home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / FGFX11.ZIP / EFFECTS.PAS < prev    next >
Pascal/Delphi Source File  |  1994-04-11  |  22KB  |  690 lines

  1. {*****************************************************************************
  2. *                                                                            *
  3. *  EFFECTS.PAS                                                               *
  4. *                                                                            *
  5. *  This program demonstrates several methods of fading in an image from an   *
  6. *  off-screen video page using either Fastgraph or Fastgraph/Light.  The set *
  7. *  of routines provided herein are written for 320 x 200 graphics video      *
  8. *  modes, but they could easily be extended to work in other resolutions.    *
  9. *                                                                            *
  10. *  The examples are by no means all inclusive.  Rather, their purpose is to  *
  11. *  illustrate a few methods of creating special effects with Fastgraph or    *
  12. *  Fastgraph/Light.                                                          *
  13. *                                                                            *
  14. *  To compile this program and link it with Fastgraph or Fastgraph/Light:    *
  15. *                                                                            *
  16. *     TPC EFFECTS                                                            *
  17. *                                                                            *
  18. *  Fastgraph (tm) and Fastgraph/Light (tm) are graphics libraries published  *
  19. *  by Ted Gruber Software.  For more info, please call, write, or FAX.       *
  20. *                                                                            *
  21. *  Ted Gruber Software                           orders/info (702) 735-1980  *
  22. *  PO Box 13408                                          FAX (702) 735-4603  *
  23. *  Las Vegas, NV  89112                                  BBS (702) 796-7134  *
  24. *                                                                            *
  25. *****************************************************************************}
  26.  
  27. program main;
  28. uses fgmain, fgmisc, fgpr;
  29.  
  30. var
  31.  
  32.    delay, scroll_delay : integer;
  33.    old_mode, new_mode : integer;
  34.    status : integer;
  35.    count : word;
  36.    start_time : longint;
  37.  
  38. {*****************************************************************************
  39. *                                                                            *
  40. *  announce                                                                  *
  41. *                                                                            *
  42. *  Display the name of the special effect we're about to see.                *
  43. *                                                                            *
  44. *****************************************************************************}
  45.  
  46. procedure announce (message : string);
  47.  
  48. var
  49.  
  50.    len : integer;
  51.    i, y : integer;
  52.  
  53. begin
  54.  
  55.    { clear the screen }
  56.  
  57.    fg_erase;
  58.  
  59.    { display the specified message at the top row }
  60.  
  61.    fg_setcolor(15);
  62.    len := length(message);
  63.    fg_locate(0,20-(len div 2));
  64.    fg_text(message,len);
  65.  
  66.    { scroll the message to the center of the screen }
  67.  
  68.    fg_setcolor(0);
  69.    y := 0;
  70.  
  71.    for i := 0 to 24 do
  72.    begin
  73.       fg_scroll(0,319,y,y+7,4,1);
  74.       fg_stall(scroll_delay);
  75.       y := y + 4;
  76.    end;
  77.  
  78.    { wait 1.5 seconds }
  79.  
  80.    fg_waitfor(27);
  81.  
  82. end;
  83.  
  84. {*****************************************************************************
  85. *                                                                            *
  86. *  irandom                                                                   *
  87. *                                                                            *
  88. *  Random number generator used in some of the effects.  It returns an       *
  89. *  integer between min and max inclusive.                                    *
  90. *                                                                            *
  91. *****************************************************************************}
  92.  
  93. function irandom (min, max : integer) : integer;
  94.  
  95. begin
  96.  
  97.    irandom := random(max-min+1) + min;
  98.  
  99. end;
  100.  
  101. {*****************************************************************************
  102. *                                                                            *
  103. *  curtain                                                                   *
  104. *                                                                            *
  105. *  Reveal each row, one at a time, starting from the bottom and proceeding   *
  106. *  to the top.  This gives the effect of a curtain rising, hence the name.   *
  107. *                                                                            *
  108. *****************************************************************************}
  109.  
  110. procedure curtain (delay : integer);
  111.  
  112. var
  113.  
  114.    y : integer;
  115.  
  116. begin
  117.  
  118.    for y := 199 downto 0 do
  119.    begin
  120.       fg_restore(0,319,y,y);
  121.       fg_stall(delay);
  122.    end;
  123.  
  124. end;
  125.  
  126. {*****************************************************************************
  127. *                                                                            *
  128. *  diagonal_fade                                                             *
  129. *                                                                            *
  130. *  This reveals the hidden page in two diagonal segments, separated by an    *
  131. *  imaginary line extending from the lower left corner to the upper right    *
  132. *  corner of the screen.  We start with the top line of the left segment and *
  133. *  the bottom line of the right segment, and continue until the entire       *
  134. *  screen is revealed.                                                       *
  135. *                                                                            *
  136. *****************************************************************************}
  137.  
  138. procedure diagonal_fade (delay : integer);
  139.  
  140. var
  141.  
  142.    xmin, xmax : integer;
  143.    ymin, ymax : integer;
  144.  
  145. begin
  146.  
  147.    xmin := 0;
  148.    xmax := 319;
  149.    ymin := 0;
  150.    ymax := 199;
  151.  
  152.    while (xmax > 0) do
  153.    begin
  154.       fg_restore(0,xmax,ymin,ymin+4);
  155.       fg_restore(xmin,319,ymax-4,ymax);
  156.       fg_stall(delay);
  157.  
  158.       xmin := xmin + 8;
  159.       xmax := xmax - 8;
  160.       ymin := ymin + 5;
  161.       ymax := ymax - 5;
  162.    end;
  163.  
  164. end;
  165.  
  166. {*****************************************************************************
  167. *                                                                            *
  168. *  horizontal_random_fade                                                    *
  169. *                                                                            *
  170. *  In this effect, the screen is divided into a series of two-pixel high     *
  171. *  rows.  Each row is revealed in random parts from left to right.  This     *
  172. *  process repeats 20 times, once for each row.  At the end, a call to the   *
  173. *  fg_restore routine guarantees that all rows are transferred.              *
  174. *                                                                            *
  175. *****************************************************************************}
  176.  
  177. procedure horizontal_random_fade (delay : integer);
  178.  
  179. var
  180.  
  181.    i, j : integer;
  182.    xwidth : integer;
  183.    xmin, xmax : integer;
  184.    y : integer;
  185.    xpos : array [0..99] of integer;
  186.  
  187. begin
  188.  
  189.    for j := 0 to 99 do
  190.       xpos[j] := 0;
  191.  
  192.    for i := 1 to 20 do
  193.    begin
  194.       for j := 0 to 99 do
  195.       begin
  196.          xmin := xpos[j];
  197.          if (xmin < 320) then
  198.          begin
  199.             xmax := xmin + irandom(1,10) * 8;
  200.             if (xmax > 320) then xmax := 320;
  201.             y := j * 2;
  202.             fg_restore(xmin,xmax-1,y,y+1);
  203.             xpos[j] := xmax;
  204.          end;
  205.       end;
  206.       fg_stall(delay);
  207.    end;
  208.  
  209.    { make sure we got them all }
  210.  
  211.    fg_restore(0,319,0,199);
  212.  
  213. end;
  214.  
  215. {*****************************************************************************
  216. *                                                                            *
  217. *  inward_tunnel_effect                                                      *
  218. *                                                                            *
  219. *  Starting at the screen edges, reveal the screen through a series of       *
  220. *  concentric hollow rectangles.                                             *
  221. *                                                                            *
  222. *****************************************************************************}
  223.  
  224. procedure inward_tunnel_effect (delay : integer);
  225.  
  226. var
  227.    xmin, xmax : integer;
  228.    ymin, ymax : integer;
  229.  
  230. begin
  231.  
  232.    xmin := 0;
  233.    xmax := 319;
  234.    ymin := 0;
  235.    ymax := 199;
  236.  
  237.    while (xmin < xmax) do
  238.    begin
  239.       fg_restore(0,319,ymin,ymin+4);
  240.       fg_restore(xmax-7,xmax,0,199);
  241.       fg_restore(0,319,ymax-4,ymax);
  242.       fg_restore(xmin,xmin+7,0,199);
  243.       fg_stall(delay);
  244.  
  245.       xmin := xmin + 8;
  246.       xmax := xmax - 8;
  247.       ymin := ymin + 5;
  248.       ymax := ymax - 5;
  249.    end;
  250.  
  251. end;
  252.  
  253. {*****************************************************************************
  254. *                                                                            *
  255. *  outward_tunnel_effect                                                     *
  256. *                                                                            *
  257. *  Starting at the screen center, reveal the screen through a series of      *
  258. *  concentric hollow rectangles.                                             *
  259. *                                                                            *
  260. *****************************************************************************}
  261.  
  262. procedure outward_tunnel_effect (delay : integer);
  263.  
  264. var
  265.  
  266.    xmin, xmax : integer;
  267.    ymin, ymax : integer;
  268.  
  269. begin
  270.  
  271.    xmin := 152;
  272.    xmax := 167;
  273.    ymin := 95;
  274.    ymax := 104;
  275.  
  276.    while (xmin >= 0) do
  277.    begin
  278.       fg_restore(xmin,xmax,ymin,ymin+5);
  279.       fg_restore(xmax-7,xmax,ymin,ymax);
  280.       fg_restore(xmin,xmax,ymax-4,ymax);
  281.       fg_restore(xmin,xmin+7,ymin,ymax);
  282.       fg_stall(delay);
  283.  
  284.       xmin := xmin - 8;
  285.       xmax := xmax + 8;
  286.       ymin := ymin - 5;
  287.       ymax := ymax + 5;
  288.    end;
  289.  
  290. end;
  291.  
  292. {*****************************************************************************
  293. *                                                                            *
  294. *  spiral_dual                                                               *
  295. *                                                                            *
  296. *  In this effect, we reveal the screen through two spirals.  One spiral     *
  297. *  emanates clockwise from the screen edges to the screen center, while the  *
  298. *  other emanates counterclockwise from the center to the screen edges.      *
  299. *                                                                            *
  300. *****************************************************************************}
  301.  
  302. procedure spiral_dual (delay : integer);
  303.  
  304. var
  305.  
  306.    xmin_outer, xmax_outer : integer;
  307.    ymin_outer, ymax_outer : integer;
  308.    xmin_inner, xmax_inner : integer;
  309.    ymin_inner, ymax_inner : integer;
  310.  
  311. begin
  312.  
  313.    xmin_outer := 0;
  314.    xmax_outer := 319;
  315.    ymin_outer := 0;
  316.    ymax_outer := 199;
  317.  
  318.    xmin_inner := 152;
  319.    xmax_inner := 167;
  320.    ymin_inner := 95;
  321.    ymax_inner := 104;
  322.  
  323.    while (xmin_outer < xmin_inner) do
  324.    begin
  325.       fg_restore(xmin_outer,xmax_outer,ymin_outer,ymin_outer+4);
  326.       fg_stall(delay);
  327.       fg_restore(xmin_inner,xmax_inner,ymax_inner-4,ymax_inner);
  328.       fg_stall(delay);
  329.       fg_restore(xmax_outer-7,xmax_outer,ymin_outer,ymax_outer);
  330.       fg_stall(delay);
  331.       fg_restore(xmax_inner+1,xmax_inner+8,ymin_inner,ymax_inner);
  332.       fg_stall(delay);
  333.       fg_restore(xmin_outer,xmax_outer,ymax_outer-4,ymax_outer);
  334.       fg_stall(delay);
  335.       fg_restore(xmin_inner-8,xmax_inner,ymin_inner,ymin_inner+4);
  336.       fg_stall(delay);
  337.       fg_restore(xmin_outer,xmin_outer+7,ymin_outer,ymax_outer);
  338.       fg_stall(delay);
  339.       fg_restore(xmin_inner-8,xmin_inner-1,ymin_inner,ymax_inner+5);
  340.       fg_stall(delay);
  341.  
  342.       xmin_outer := xmin_outer + 8;
  343.       xmax_outer := xmax_outer - 8;
  344.       ymin_outer := ymin_outer + 5;
  345.       ymax_outer := ymax_outer - 5;
  346.  
  347.       xmin_inner := xmin_inner - 8;
  348.       xmax_inner := xmax_inner + 8;
  349.       ymin_inner := ymin_inner - 5;
  350.       ymax_inner := ymax_inner + 5;
  351.    end;
  352.  
  353. end;
  354.  
  355. {*****************************************************************************
  356. *                                                                            *
  357. *  spiral_layered                                                            *
  358. *                                                                            *
  359. *  This effect is similar to the normal spiral.  Instead of revealing the    *
  360. *  screen in one iteration, this effect does so in four iterations (layers), *
  361. *  each moving more toward the screen center.                                *
  362. *                                                                            *
  363. *****************************************************************************}
  364.  
  365. procedure spiral_layered (delay : integer);
  366.  
  367. var
  368.  
  369.    i : integer;
  370.    xmin, xmax : integer;
  371.    ymin, ymax : integer;
  372.  
  373. begin
  374.  
  375.    for i := 0 to 3 do
  376.    begin
  377.       xmin := i * 8;
  378.       xmax := 319 - xmin;
  379.       ymin := i * 5;
  380.       ymax := 199 - ymin;
  381.  
  382.       while (xmin < xmax) do
  383.       begin
  384.          fg_restore(xmin,xmax,ymin,ymin+4);
  385.          fg_stall(delay);
  386.          fg_restore(xmax-7,xmax,ymin,ymax);
  387.          fg_stall(delay);
  388.          fg_restore(xmin,xmax,ymax-4,ymax);
  389.          fg_stall(delay);
  390.          fg_restore(xmin,xmin+7,ymin,ymax);
  391.          fg_stall(delay);
  392.  
  393.          xmin := xmin + 32;
  394.          xmax := xmax - 32;
  395.          ymin := ymin + 20;
  396.          ymax := ymax - 20;
  397.       end;
  398.    end;
  399.  
  400. end;
  401.  
  402. {*****************************************************************************
  403. *                                                                            *
  404. *  spiral_normal                                                             *
  405. *                                                                            *
  406. *  This is a spiral effect in which we reveal the screen as a series of      *
  407. *  rectangles, emanating from the screen edges and proceeding clockwise to   *
  408. *  the center of the screen.                                                 *
  409. *                                                                            *
  410. *****************************************************************************}
  411.  
  412. procedure spiral_normal (delay : integer);
  413.  
  414. var
  415.  
  416.    xmin, xmax : integer;
  417.    ymin, ymax : integer;
  418.  
  419. begin
  420.  
  421.    xmin := 0;
  422.    xmax := 319;
  423.    ymin := 0;
  424.    ymax := 199;
  425.  
  426.    while (xmin < xmax) do
  427.    begin
  428.       fg_restore(xmin,xmax,ymin,ymin+19);
  429.       fg_stall(delay);
  430.       fg_restore(xmax-31,xmax,ymin,ymax);
  431.       fg_stall(delay);
  432.       fg_restore(xmin,xmax,ymax-19,ymax);
  433.       fg_stall(delay);
  434.       fg_restore(xmin,xmin+31,ymin,ymax);
  435.       fg_stall(delay);
  436.  
  437.       xmin := xmin + 32;
  438.       xmax := xmax - 32;
  439.       ymin := ymin + 20;
  440.       ymax := ymax - 20;
  441.    end;
  442.  
  443. end;
  444.  
  445. {*****************************************************************************
  446. *                                                                            *
  447. *  split_screen                                                              *
  448. *                                                                            *
  449. *  Reveal the top half of from left to right while revealing the bottom half *
  450. *  from right to left.                                                       *
  451. *                                                                            *
  452. *****************************************************************************}
  453.  
  454. procedure split_screen (delay : integer);
  455.  
  456. var
  457.  
  458.    xmin, xmax : integer;
  459.  
  460. begin
  461.  
  462.    xmin := 0;
  463.    xmax := 319;
  464.  
  465.    while (xmax > 0) do
  466.    begin
  467.       fg_restore(xmin,xmin+7,0,99);
  468.       fg_restore(xmax-7,xmax,100,199);
  469.       fg_stall(delay);
  470.       xmin := xmin + 8;
  471.       xmax := xmax - 8;
  472.    end;
  473.  
  474. end;
  475.  
  476. {*****************************************************************************
  477. *                                                                            *
  478. *  unveil                                                                    *
  479. *                                                                            *
  480. *  Starting at the center, reveal the screen in small horizontal increments  *
  481. *  until we reach the left and right edges.                                  *
  482. *                                                                            *
  483. *****************************************************************************}
  484.  
  485. procedure unveil (delay : integer);
  486.  
  487. var
  488.  
  489.    xmin, xmax : integer;
  490.  
  491. begin
  492.  
  493.    xmin := 152;
  494.    xmax := 167;
  495.  
  496.    while (xmin >= 0) do
  497.    begin
  498.       fg_restore(xmin,xmin+7,0,199);
  499.       fg_restore(xmax-7,xmax,0,199);
  500.       fg_stall(delay);
  501.       xmin := xmin - 8;
  502.       xmax := xmax + 8;
  503.    end;
  504.  
  505. end;
  506.  
  507. {*****************************************************************************
  508. *                                                                            *
  509. *  venetian_blind                                                            *
  510. *                                                                            *
  511. *  Reveal the screen in four iterations, each revealing every fourth row.    *
  512. *  The effect produced resembles opening a Venetian blind.                   *
  513. *                                                                            *
  514. *****************************************************************************}
  515.  
  516. procedure venetian_blind (delay : integer);
  517.  
  518. var
  519.  
  520.    y : integer;
  521.  
  522. begin
  523.  
  524.    y := 0;
  525.    while (y < 200) do
  526.    begin
  527.       fg_restore(0,319,y,y);
  528.       y := y + 4;
  529.    end;
  530.    fg_stall(delay);
  531.  
  532.    y := 1;
  533.    while (y < 200) do
  534.    begin
  535.       fg_restore(0,319,y,y);
  536.       y := y + 4;
  537.    end;
  538.    fg_stall(delay);
  539.  
  540.    y := 2;
  541.    while (y < 200) do
  542.    begin
  543.       fg_restore(0,319,y,y);
  544.       y := y + 4;
  545.    end;
  546.    fg_stall(delay);
  547.  
  548.    y := 3;
  549.    while (y < 200) do
  550.    begin
  551.       fg_restore(0,319,y,y);
  552.       y := y + 4;
  553.    end;
  554.    fg_stall(delay);
  555.  
  556. end;
  557.  
  558. {*****************************************************************************
  559. *                                                                            *
  560. *  main program                                                              *
  561. *                                                                            *
  562. *****************************************************************************}
  563.  
  564. begin
  565.  
  566.    { make sure a 320 x 200 color graphics mode is available }
  567.  
  568.    new_mode := fg_bestmode(320,200,2);
  569.    if (new_mode < 0) or (new_mode = 12) then
  570.    begin
  571.       writeln('This program requires a 320 x 200 color graphics mode.');
  572.       exit;
  573.    end;
  574.  
  575.    { determine the number of delay units per half clock tick }
  576.  
  577.    delay := fg_measure div 2;
  578.  
  579.    { initialize Fastgraph for the selected video mode }
  580.  
  581.    old_mode := fg_getmode;
  582.    fg_setmode(new_mode);
  583.    status := fg_allocate(1);
  584.  
  585.    { display a packed pixel run file on a hidden page }
  586.  
  587.    fg_sethpage(1);
  588.    fg_setpage(1);
  589.    fg_move(0,199);
  590.    fg_dispfile('FG.PPR'+chr(0),320,1);
  591.    fg_setpage(0);
  592.  
  593.    { compute the number of delay units needed to make the text scroll }
  594.    { down at the same rate, regardless of the CPU speed or video mode }
  595.  
  596.    count := 0;
  597.    fg_waitfor(1);
  598.    start_time := fg_getclock;
  599.    repeat
  600.    begin
  601.       fg_scroll(0,319,0,7,4,1);
  602.       inc(count);
  603.    end;
  604.    until (fg_getclock <> start_time);
  605.  
  606.    scroll_delay := (delay div 8) - (delay * 2) div count;
  607.    if (scroll_delay < 0) then scroll_delay := 0;
  608.  
  609.    { demonstrate the inward tunnel effect }
  610.  
  611.    announce('inward tunnel effect');
  612.    inward_tunnel_effect(0);
  613.    fg_waitfor(27);
  614.    announce('inward tunnel effect with delay');
  615.    inward_tunnel_effect(delay);
  616.    fg_waitfor(27);
  617.  
  618.    { demonstrate the outward tunnel effect }
  619.  
  620.    announce('outward tunnel effect');
  621.    outward_tunnel_effect(0);
  622.    fg_waitfor(27);
  623.    announce('outward tunnel effect with delay');
  624.    outward_tunnel_effect(delay);
  625.    fg_waitfor(27);
  626.  
  627.    { demonstrate the diagonal fade }
  628.  
  629.    announce('diagonal fade');
  630.    diagonal_fade(0);
  631.    fg_waitfor(27);
  632.    announce('diagonal fade with delay');
  633.    diagonal_fade(delay div 2);
  634.    fg_waitfor(27);
  635.  
  636.    { demonstrate the horizontal random fade }
  637.  
  638.    announce('horizontal random fade');
  639.    horizontal_random_fade(delay);
  640.    fg_waitfor(27);
  641.  
  642.    { demonstrate the curtain effect }
  643.  
  644.    announce('curtain');
  645.    curtain(delay div 8);
  646.    fg_waitfor(27);
  647.  
  648.    { demonstrate the spiral effect }
  649.  
  650.    announce('spiral');
  651.    spiral_normal(delay*2);
  652.    fg_waitfor(27);
  653.  
  654.    { demonstrate the layered spiral effect }
  655.  
  656.    announce('layered spiral');
  657.    spiral_layered(delay);
  658.    fg_waitfor(27);
  659.  
  660.    { demonstrate the dual spiral effect }
  661.  
  662.    announce('dual spiral');
  663.    spiral_dual(delay div 2);
  664.    fg_waitfor(27);
  665.  
  666.    { demonstrate the split screen effect }
  667.  
  668.    announce('split screen');
  669.    split_screen(delay div 2);
  670.    fg_waitfor(27);
  671.  
  672.    { demonstrate the unveil effect }
  673.  
  674.    announce('unveil');
  675.    unveil(delay div 4);
  676.    fg_waitfor(27);
  677.  
  678.    { demonstrate the 'venetian blind' effect }
  679.  
  680.    announce('venetian blind');
  681.    venetian_blind(delay);
  682.    fg_waitfor(27);
  683.  
  684.    { restore the original video mode and screen attributes }
  685.  
  686.    status := fg_freepage(1);
  687.    fg_setmode(old_mode);
  688.    fg_reset;
  689. end.
  690.